package blacklistoperationlogic

import (
	"context"
	"dfx_cmdb/cmdb-blacklist-rpc/internal/svc"
	"fmt"
	"strings"

	"github.com/zeromicro/go-zero/core/logc"
)

func RedisReader(ctx context.Context, s *svc.ServiceContext, blacklistType string) (map[string][]string, error) {
	// 初始化返回的 map（确保不为 nil）
	result := make(map[string][]string)
	var cursor uint64
	totalKeys := 0

	logc.Debugf(ctx, "开始扫描 Redis key: %s", blacklistType)

	for {
		// 检查 context 是否已取消
		select {
		case <-ctx.Done():
			return nil, fmt.Errorf("操作被取消: %w", ctx.Err())
		default:
		}

		keys, newCursor, err := s.RC.Scan(ctx, cursor, fmt.Sprintf("%s:*", blacklistType), 1000).Result()
		if err != nil {
			logc.Errorf(ctx, "Redis Scan 失败: %v, prefix: %s", err, blacklistType)
			return nil, fmt.Errorf("扫描 Redis key 失败: %w", err)
		}

		// 处理这批 keys
		for _, key := range keys {
			// 从 key 中提取信息，不需要 Get value
			// key 格式: blacklist:haproxy:newdcs-openretry_9994:201.214.210.132
			strAry := strings.Split(key, ":")
			if len(strAry) == 4 {
				setName := strAry[2] // 例如: newdcs-openretry_9994
				ip := strAry[3]      // 例如: 201.214.210.132
				result[setName] = append(result[setName], ip)
				totalKeys++
			} else {
				logc.Errorf(ctx, "跳过格式不正确的 key: %s", key)
			}
		}

		logc.Debugf(ctx, "已扫描 %d 个 keys，当前批次: %d", totalKeys, len(keys))

		// 如果 cursor 为 0，说明已扫描完成
		if newCursor == 0 {
			break
		}
		cursor = newCursor
	}

	logc.Infof(ctx, "Redis 扫描完成，共处理 %d 个 keys，分组数: %d", totalKeys, len(result))

	return result, nil
}
